#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
NetCDF文件分析工具
用于探索himawari9_20250827_1800.nc文件的内容和结构
"""

import netCDF4 as nc
import numpy as np
import pandas as pd
import xarray as xr
from datetime import datetime
import os

def analyze_netcdf_file(file_path):
    """
    分析NetCDF文件的结构和内容
    """
    print("=" * 60)
    print("NetCDF文件分析报告")
    print("=" * 60)
    print(f"文件: {os.path.basename(file_path)}")
    print(f"分析时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    print("=" * 60)
    
    try:
        # 使用netCDF4库打开文件
        with nc.Dataset(file_path, 'r') as dataset:
            print("\n1. 文件基本信息")
            print("-" * 40)
            print(f"文件格式: {dataset.file_format}")
            print(f"文件大小: {os.path.getsize(file_path) / (1024*1024):.2f} MB")
            
            print("\n2. 全局属性")
            print("-" * 40)
            if dataset.ncattrs():
                for attr in dataset.ncattrs():
                    print(f"{attr}: {getattr(dataset, attr)}")
            else:
                print("无全局属性")
            
            print("\n3. 维度信息")
            print("-" * 40)
            for dim_name, dim in dataset.dimensions.items():
                print(f"{dim_name}: {len(dim)} 个元素")
            
            print("\n4. 变量信息")
            print("-" * 40)
            variables_info = []
            for var_name, var in dataset.variables.items():
                var_info = {
                    'name': var_name,
                    'dimensions': var.dimensions,
                    'shape': var.shape,
                    'dtype': var.dtype,
                    'units': var.units if hasattr(var, 'units') else 'N/A',
                    'long_name': var.long_name if hasattr(var, 'long_name') else 'N/A'
                }
                variables_info.append(var_info)
                print(f"变量: {var_name}")
                print(f"  维度: {var.dimensions}")
                print(f"  形状: {var.shape}")
                print(f"  数据类型: {var.dtype}")
                if hasattr(var, 'units'):
                    print(f"  单位: {var.units}")
                if hasattr(var, 'long_name'):
                    print(f"  描述: {var.long_name}")
                print()
            
            print("\n5. 数据预览")
            print("-" * 40)
            # 选择第一个数据变量进行预览（跳过坐标变量）
            data_vars = [var for var in dataset.variables.values() 
                        if var.dimensions and not var_name.startswith(('lat', 'lon', 'time', 'x', 'y'))]
            
            if data_vars:
                sample_var = data_vars[0]
                print(f"采样变量: {sample_var.name}")
                data = sample_var[:]
                print(f"数据形状: {data.shape}")
                print(f"数据类型: {data.dtype}")
                print(f"最小值: {np.nanmin(data):.4f}")
                print(f"最大值: {np.nanmax(data):.4f}")
                print(f"平均值: {np.nanmean(data):.4f}")
                
                # 显示前几个值（如果数据不是太大）
                if data.size <= 100:
                    print("前10个值:", data.flatten()[:10])
                else:
                    print("数据量较大，显示部分统计信息")
            
            return variables_info
            
    except Exception as e:
        print(f"读取文件时出错: {e}")
        return None

def export_to_csv(file_path, output_csv=None):
    """
    将NetCDF数据导出为CSV格式
    """
    if output_csv is None:
        output_csv = os.path.splitext(file_path)[0] + '.csv'
    
    try:
        # 使用xarray打开文件（更适合数据处理）
        ds = xr.open_dataset(file_path)
        
        print(f"\n正在导出数据到: {output_csv}")
        
        # 获取所有数据变量
        data_vars = [var for var in ds.data_vars]
        
        if not data_vars:
            print("未找到数据变量")
            return False
        
        # 选择第一个数据变量进行导出
        main_var = data_vars[0]
        print(f"导出变量: {main_var}")
        
        # 转换为DataFrame
        df = ds[main_var].to_dataframe().reset_index()
        
        # 保存为CSV
        df.to_csv(output_csv, index=False, encoding='utf-8')
        print(f"成功导出 {len(df)} 行数据")
        print(f"CSV文件列名: {list(df.columns)}")
        
        ds.close()
        return True
        
    except Exception as e:
        print(f"导出CSV时出错: {e}")
        return False

def main():
    import argparse
    
    parser = argparse.ArgumentParser(description='分析NetCDF文件')
    parser.add_argument('file_path', help='NetCDF文件路径')
    parser.add_argument('--export-csv', action='store_true', help='导出为CSV文件')
    parser.add_argument('--output-csv', help='输出CSV文件名')
    
    args = parser.parse_args()
    
    if not os.path.exists(args.file_path):
        print(f"错误: 文件 {args.file_path} 不存在")
        return
    
    # 分析文件
    variables_info = analyze_netcdf_file(args.file_path)
    
    if variables_info and args.export_csv:
        export_to_csv(args.file_path, args.output_csv)
    
    print("\n分析完成！")

if __name__ == "__main__":
    main()
